{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 目标\n",
    " 1. 单点结构面临的问题\n",
    " 2. 集群架构面临的问题\n",
    " 3. Hadoop集群架构\n",
    " 4. 冗余化数据存储\n",
    " 5. 分布式文件系统"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 单点结构面临的问题\n",
    "1. cup  \n",
    "2. memory  \n",
    "3. disk"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 集群架构\n",
    "1. 一个Switch下分多个Switch\n",
    "2. 每个下分Switch下为rack\n",
    "3. 一个rack里有多个节点"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  集群架构面临的问题\n",
    "1. 节点故障\n",
    "2. 网络带宽瓶颈\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.Hadoop分布式集群\n",
    "1. hadoop是依据mapreduce的原理，用Java语言实现的分布式处理机制\n",
    "2. Hadoop是一个能够对大量数据进行分布式处理的软件框架，实现了Google的MapReduce编程模型和框架，能够把应用程序分割成许多的小的工作单元，并把这些单元放到任何集群节点上执行\n",
    "3. MapReduce是Hadoop中的一个数据运算核心模块\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Map-Reduce集群运算问题的解决方案\n",
    "1. 在多节点上冗余地存储数据，以保证数据的持续性\n",
    "2. 将计算移向数据端，以最大程度减少数据移动\n",
    "3. 简单的程序模型，隐藏所有的复杂度\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.冗余化数据存储结构\n",
    "### 分布式文件存储系统：\n",
    "1. 提供全局的文件命名空间，冗余度和可获取性\n",
    "2. 例如Google的GFS，hadoop的HDFS\n",
    "### 典型的应用场景与模式：\n",
    "1. 超大级别的数据量（100GB到100TB级别）\n",
    "2. 数据很少被全部替换\n",
    "3. 最常见的操作为读取和追加数据\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. 分布式文件系统\n",
    "1. 数据以‘块状’形式在多台机器上存储\n",
    "2. 每个数据块都会重复地在多台机器上存储\n",
    "3. 保证数据的持续性和随时可取性\n",
    "4. 服务器块同时也用作计算服务器\n",
    "5. 把运算挪向数据处\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 服务器块：\n",
    "1. 文件被分作16-64MB大小的连续块\n",
    "2. 每个文件块会被重复的存储2到3次\n",
    "3. 尽量保证重复的数据块在不同的机架上\n",
    "##### 主节点：\n",
    "1. Hadoop的HDFS里叫做Name节点\n",
    "2. 存储元数据记录文件存储结构和地址\n",
    "3. 最常见的操作为读取和追加数据\n",
    "##### 文件访问的客户端库：\n",
    "1. 询问主节点以获取块服务器地址\n",
    "2. 直接连接相应服务器块获取数据\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Map Reduce变换数据\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Hadoop组成\n",
    "1. Hadoop Common \n",
    "\t 工具包，为其它hadoop模块提供基础设施\n",
    "2. Hadoop HDFS\n",
    "\t分布式文件系统，对海量数据存储\n",
    "3. Map-Reduce\n",
    "\t分布式处理策略，计算模型，对海量数据处理\n",
    "4. Yarn\n",
    "\t分布式资源管理，调度\n",
    "|"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 编程模型：Map-Reduce\n",
    "* 手头上有一个超大的文本文件\n",
    "* 需要统计每个文本中的词出现的次数\n",
    "* 实际应用场景\n",
    "\t\t1. 从web服务器日志中找出高频热门url\n",
    "\t\t2. 搜索词统计\n",
    "\t\t3. 区分垃圾邮件和短信\n",
    "\t\t4. 舆情分析（正负面评论）\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### Map-Reduce：总览\n",
    "* Map\n",
    "    逐个文件逐行扫描\n",
    "    扫描的同时抽取出我们感兴趣的内容（Keys）\n",
    "* Group by key\n",
    "    排序和洗牌\n",
    "* Reduce\n",
    "    聚合，总结，过滤或转换\n",
    "    写入结果\n",
    "* Map和Reduce函数要根据具体问题具体实现\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### Map-Reduce：Reduce步骤\n",
    "输入：一些键值对\n",
    "编程人员需要定义两个函数：\n",
    "* Map(k, v) -> <k’, v’>*\n",
    "\t对一个键值对输入产生一序列中间键值对\n",
    "\tMap函数将对所有键值对操作\n",
    "* Reduce(k’,<v’>*)-><k’,v’’>*\n",
    "\t所有有相同key  ，k’的值v’被reduce到一起\n",
    "\tReduce函数对每一个不同的Key k’进行操作\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Map-Reduce：环境\n",
    "* 运行Map-Reduce模型，还需要hadoop环境解决\n",
    "* 对原始数据进行区分(Partition)\n",
    "* 调度程序在一系列的机器集群上都并行运行\n",
    "* 执行中间过程的group by key 步骤\n",
    "* 处理运行过程中的突发节点故障\n",
    "* 处理并行运行过程中的节点和节点之间的通信\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 数据流\n",
    "* 输入和输出都被存储在分布式文件系统HDFS上\n",
    "* 实际调度操作时，调度器会尽可能将map任务移至靠近数据物理存储的节点上\n",
    "* 中间结果将会被存储在map和reduce操作的本地文件系统上\n",
    "* 实际运行过程中，一个Map-Reduce产生的结构，很有可能作为另一个Map-Reduce任务的输入\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 主节点的协调功能\n",
    "\n",
    "* 主节点主要负责系统的协调\n",
    "* 任务状态：等待初始，进行中，完成\n",
    "* 一旦有能工作的worker，待初始任务被调度运行\n",
    "* 一个Map任务完成后，它会向主节点发送它的产生的R个中间文件\t的位置和大小，每个文件对应一个reducer\n",
    "* 主节点将这些信息传送至reducer\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 节点故障\n",
    "*  Map任务节点故障\n",
    "1. 所有运行中和已经完成的map任务，都被重置为待初始\n",
    "2. 所有这些待初始Map任务，将重新被分配到能工作的节点worker\n",
    "* Reduce任务节点故障\n",
    "1. 只有运行中而未完成的reduce任务被设定为待初始\n",
    "2. 这些待初始reduce任务被重新分配至其他worker上\n",
    "* 主节点故障\n",
    "1. 整个Map-Reduce任务中断，同时通知客户端管理员\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 启动多少个Map和Reduce任务\n",
    "* M个Map任务和R个Reduce任务\n",
    "* 实际操作经验法则：\n",
    "\t1. 通常情况下我们会让M远大于集群中的节点数\n",
    "\t2. 通常设置一个分布式文件系统块对应一个Map任务\n",
    "\t3. 提升动态加载平衡，同时加速节点故障时的任务恢复\n",
    "* 通常R比M要小\n",
    "\t1. 因为输出要分布在R文件上\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 动态添加map和reduce的大小，增加并行度\n",
    "* map是配置mapred.max.split.size，来定义map处理文件的大小，默认是256000000字段，换算就是256M。 如果想增加map的并行度，那么就是减少map处理文件的大小 set mapred.max.split.size=xxx（更小的字节）\n",
    "\n",
    "* reduce和map是一致的，修改hive.exec.reducers.bytes.per.reducer这个参数 通过控制这个来定义一个reduce处理文件的大小 hive.exec.reducers.bytes.per.reducer\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 改进：combiners\n",
    "* 很多时候一个Map任务为同一个key k会产生如（k,v1）,(k,v2)的键值对：\n",
    "\t例如，词频统计任务中的高频词产生的中间结果\n",
    "* 在Mapper中，进行预聚合操作，来节约网络的时间成本\n",
    "\t合并（k, list(v1)）->v2\n",
    "\t合并器(combiner)通常和reduce函数是一致的\n",
    "* 以词频统计为例：\n",
    "    合并器（Combiner）预先合并了单个mapper（单个节点）中键值对\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 云计算\n",
    "* 可能会提供额外的服务：例如持续性存储\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Hive"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* Hive\n",
    "    1. 在Hadoop的Map-Reduce之上提供的类SQL数据提取操作功能\n",
    "\n",
    "* Spark\n",
    "    1. 分布式计算框架，是Map-Reduce替代方案，兼容HDFS和Hive，\n",
    "    2. 可兼容hadoop生态，弥补Mapduce不足\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#####  Hive介绍\n",
    "    *  Hive是基于Hadoop的一个数据仓库工具，可以将结构化的数据文件映射为一张数据库表，并提供简单的sql查询功能，可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低，可以通过类SQL语句快速实现简单的MapReduce统计，十分适合数据仓库的统计分析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### Hive 架构介绍\n",
    "\n",
    "\n",
    "* 用户接口三个：CLI，Client 和 WUI。在启动 Client模式的时候，需要指出Hive Server在哪个节点启动，WUI是通过浏览器访问Hive\n",
    "* Hive将元数据存储在数据库中，如mysql。Hive中的元数据包括表的名字，表的列和分区及其属性，表的属性，表的数据所在目录等。\n",
    "* HQL生成的查询计划存储在HDFS中，并在随后有MapReduce调用执行。  　　\n",
    "* Hive的数据存储在HDFS中，大部分的查询、计算由MapReduce完成"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 关联规则挖掘"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 关联规则介绍\n",
    "* 数据挖掘是一项从大量的记录数据中提取有价值的、人们感兴趣的知识，这些知识是隐含的、事先未知的有用信息，提取的知识一般可表示为概念(Concepts)、规则(Rules)、规律(Regular ides)、模式(Patterns)等形式。\n",
    "\n",
    "* 规则：样本和样本之间的关联性\n",
    "* 模式：通过特征X，经过函数f得到结构y \n",
    "\n",
    "* 关联规则是当前数据挖掘研究的主要方法之一，它反映一个事物与其他事物之间的相互依存性和关联性 \n",
    "\n",
    "* 典型的关联规则发现问题是对超市中的货篮数据(MarketBasket)进行分析。通过发现顾客放入货篮中的不同商品之间的关系来分析顾客的购买习惯。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 关联规则：发现数据中的规律\n",
    "* 超市中什么产品会一起购买?(组合推荐) \n",
    "\n",
    "* 顾客在买了一台PC之后下一步会购买?(搭配推荐)\n",
    "\n",
    "* 哪种DNA对这种药物敏感? \n",
    "\n",
    "* 我们如何自动对Web文档进行分类? \n",
    "\n",
    "* 论⽂查重? \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 关联规则基本概念\n",
    "* 每一个样本叫一个项目\n",
    "* 一个顾客购买商品的购物车，项目的组合叫事务\n",
    "    事务中有意义的项目集合叫做项集，比如面包和牛奶，就是二项集\n",
    "    我们要挖掘的是项集\n",
    "\n",
    "* 1000个人购物，1000个购物单，牛奶在购物单中出现的次数叫支持度\n",
    "    当支持度高到一定程度，才会观测出有意义的信息和规则，设定一个阈值\n",
    " \n",
    "* 项集A在事务数据库D中出现的次数占D中总事务的百分比叫做项集的支持度。如果项集的支持度超过用户给定的最小支持度阈值，就称该项集是频繁项集(或频集)\n",
    "* 关联规则是形如X⇒Y的逻辑蕴含式，其中X⊂I ，Y⊂I，且X∩Y=∅ \n",
    "\n",
    "* 如果事务数据库D中有s%的事务包含X∪Y，则称关联规则X⇒Y的支持度为s% \n",
    "\n",
    "* 关联规则的信任度为support (X∪Y)/support (X) 也就是: \n",
    "\n",
    "\tsupport (X⇒Y)=P (X ∪Y) \n",
    "\n",
    "\tconfidence (X⇒Y)=P (Y | X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 支持度和信任度理解\n",
    "* 支持度：关联规则产出的是规则，找到频繁项集，再找出有意义的规则，支持度确定哪些是经常出现的\n",
    "\n",
    "\n",
    "* 信任度：信任度产出规则，知道X和Y是一个频繁项目集  ，谁对谁的影响更大\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 强关联规则\n",
    "* 强关联规则就是支持度和信任度分别满足用户给定阈值的规则\n",
    "\n",
    "    例: \n",
    "    􏰀􏰁\t交易ID 􏰂      购买的商品􏰃􏰄􏰅􏰆 \n",
    "\t2000           A,B,C \n",
    "\t1000           A,C \n",
    "\t4000           A,D \n",
    "\t5000\t\t  B,E,F \n",
    "\n",
    "* 设最小支持度为50%, 最小可信度为50%, 则可得到\n",
    "     A ⇒ C (50%, 66.6%)\n",
    "     C ⇒ A (50%, 100%) \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 关联规则挖掘算法\n",
    "* Agrawal等人提出的AIS，Apriori和AprioriTid \n",
    "\n",
    "* Cumulate和Stratify，Houstsma等人提出的SETM \n",
    "\n",
    "* Park等人提出的DHP \n",
    "\n",
    "* Savasere等人的PARTITION \n",
    "\n",
    "* Han等人提出的不生成候选集直接生成频繁模式FPGrowth\n",
    "\n",
    "* 其中最有效和有影响的算法为Apriori，DHP 和PARTITION，FPGrowth"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### Apriori算法\n",
    "* Apriori算法命名源于算法使用了频繁项集性质的先验(Prior)知识\n",
    " \n",
    "* Apriori算法将发现关联规则的过程分为两个步骤: \n",
    "\n",
    "\t1. 通过迭代，检索出事务数据库中的所有频繁项集，即支持度不\t    低于用户设定的阈值的项集\n",
    "\t2. 利用频繁项集构造出满足用户最小信任度的规则 \n",
    " \n",
    "* 挖掘或识别出所有频繁项集是该算法的核心，占整个计算量的大部分\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### Apriori两个性质\n",
    "* 性质1: 频繁项集的所有非空子集必为频繁项集\n",
    "\n",
    "\n",
    "* 性质2: 非频繁项集的超集一定是非频繁的\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### Apriori原理执行步骤\n",
    "* 剪枝步:C(k)要过滤掉未达到阈值的项集\n",
    "\n",
    "* 连接步（组合）:为找L(k)，通过将L(k-1)与⾃⾝连接产生候选k项集的集合 C(k)\n",
    "\n",
    "\n",
    "* 剪枝-》连接-》剪枝-》连接-》剪枝-》连接-》….执行K次\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### Apriori算法实例\n",
    "* 现有A、B、C、D、E五种商品的交易记录表，试找出三种商品关联销售情况(k=3)，最小支持度=50% \n",
    "\n",
    "\n",
    "\t交易号\t\t商品代码\n",
    "\t100\t\t\tA,C,D\n",
    "\t200\t\t\tB,C,E\n",
    "\t300\t\t\tA,B,C,E\n",
    "\t400\t\t\tB,E\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### Apriori算法不足\n",
    "* 验证过程是性能瓶颈\n",
    "\t1. 交易数据库可能非常⼤大 \n",
    "\t2. 比如频集最多包含10个项，那么就需要扫描交易数据库10遍\n",
    "\t3. 需要很大的I/O负载\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
